#include "Thread.hpp"
// 操作共享变量会有问题的售票系统代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
// #include <mutex>

// std::mutex cpp_lock;
// int ticket = 1000;

// //模拟多线程抢一定数量的票
// void *route(void *arg)
// {
//     char *id = (char *)arg;
//     while (1)
//     {
//         if (ticket > 0)
//         {
//             usleep(1000);
//             printf("%s sells ticket:%d\n", id, ticket);
//             ticket--;
//             printf("success");
//         }
//         else
//         {
//             break;
//         }
//     }
//     return nullptr;
// }
// int main(void)
// {
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, nullptr, route, (void*)"thread 1");
//     pthread_create(&t2, nullptr, route, (void*)"thread 2");
//     pthread_create(&t3, nullptr, route, (void*)"thread 3");
//     pthread_create(&t4, nullptr, route, (void*)"thread 4");
//     pthread_join(t1, nullptr);
//     pthread_join(t2, nullptr);
//     pthread_join(t3, nullptr);
//     pthread_join(t4, nullptr);
// }

// int ticket = 1000;
// pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;//创建全局的锁解决问题
// //模拟多线程抢一定数量的票
// void *route(void *arg)
// {
//     char *id = (char *)arg;
//     while (1)
//     {
//         pthread_mutex_lock(&lock);
//         if (ticket > 0)
//         {
//             usleep(1000);
//             printf("%s sells ticket:%d\n", id, ticket);
//             ticket--;
//             pthread_mutex_unlock(&lock);

//         }
//         else
//         {
//             pthread_mutex_unlock(&lock);
//             break;
//         }
//     }
//     return nullptr;
// }
// int main(void)
// {
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, nullptr, route, (void*)"thread 1");
//     pthread_create(&t2, nullptr, route, (void*)"thread 2");
//     pthread_create(&t3, nullptr, route, (void*)"thread 3");
//     pthread_create(&t4, nullptr, route, (void*)"thread 4");
//     pthread_join(t1, nullptr);
//     pthread_join(t2, nullptr);
//     pthread_join(t3, nullptr);
//     pthread_join(t4, nullptr);
// }




// class ThreadData
// {
//     public:
//     ThreadData(const std::string& name,pthread_mutex_t& lock)
//     :_name(name),_lock(lock)
//     {}

//     std::string _name;//线程的名字
//     pthread_mutex_t& _lock;//锁
// };

// // 创建局部的锁来解决问题
// int ticket = 1000;
// // 模拟多线程抢一定数量的票
// void *route(void *args)
// {
//     ThreadData* data = static_cast<ThreadData*>(args);
//     while (1)
//     {
//         // 加锁-力度尽可能的要精细，不包含过多临界区代码
//         pthread_mutex_lock(&data->_lock);
//         if (ticket > 0)
//         {
//             usleep(1000);
//             printf("%s sells ticket:%d\n", data->_name.c_str(),ticket);
//             ticket--;
//             pthread_mutex_unlock(&data->_lock);
//         }
//         else
//         {
//             pthread_mutex_unlock(&data->_lock);
//             break;
//         }
//     }
//     return nullptr;
// }



// int main(void)
// {

//     // 创建局部的锁
//     pthread_mutex_t mutex;
//     // 初始化锁
//     pthread_mutex_init(&mutex, nullptr);

//     //创建4个数据包
//     ThreadData* td1 = new ThreadData("pthread-1",mutex);
//     ThreadData* td2 = new ThreadData("pthread-2",mutex);
//     ThreadData* td3 = new ThreadData("pthread-3",mutex);
//     ThreadData* td4 = new ThreadData("pthread-4",mutex);

//     // 传入锁给线程
//     pthread_t t1, t2, t3, t4;
//     pthread_create(&t1, nullptr, route, td1);
//     pthread_create(&t2, nullptr, route, td2);
//     pthread_create(&t3, nullptr, route, td3);
//     pthread_create(&t4, nullptr, route, td4);

//     pthread_join(t1, nullptr);
//     pthread_join(t2, nullptr);
//     pthread_join(t3, nullptr);
//     pthread_join(t4, nullptr);

//     //释放锁
//     pthread_mutex_destroy(&mutex);
//     //释放数据包
    
// }
